package sjjg.graph;

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;

public class EdgeWeightGraph {
    //节点数
    private int V;
    //无向边数
    private int E;
    //邻接表
    public Queue<Edge>[]adj;
    //构造函数初始化数据
   public EdgeWeightGraph(int V){
        this.V=V;
        this.E=0;
        this.adj=new LinkedBlockingQueue[V];
        for (int i = 0; i < adj.length; i++) {
            adj[i]=new LinkedBlockingQueue<>();
        }
    }
    //返回顶点数
    public int V(){
        return V;
    }
    //返回无向边数
    public int E(){
          return E;
    }
    //为某个节点添加新边
    public void addEdge(Edge edge){
            adj[edge.either()].add(edge);
            adj[edge.another(edge.either())].add(edge);
            E++;
    }
    //返回该节点所关联的所有边
    public Queue<Edge>adj(int v){
        return adj[v];
    }
    //返回该图的所有边
    public Queue<Edge>edges(){
       Queue<Edge> edges = new LinkedBlockingQueue<>();
        //遍历所有邻接表
        for (int v = 0; v < V; v++) {

            for (Edge edge : adj[v]) {
                //对于无向图 这样会导致同一条边会被添加两次
                     //可以制定一个规则如果某条边的v<w那么就把它加入队列 这样就能保证每条边只被添加一次
                     if(v<edge.another(v)){
                         edges.add(edge);
                     }
            }
        }
        return edges;
    }
}
